#include "Object.h"
#include "TinyJsonValue.h"

namespace tinyjson
{
    Object::Object()
    {
        m_map.clear();
    }
    Object::Object(const std::map<String, TinyJsonValuePtr> &m)
    {
        m_map = m;
    }

    Boolean Object::empty() const
    {
        return m_map.empty();
    }

    size_t Object::size() const
    {
        return m_map.size();
    }

    Object::const_iterator Object::begin() const
    {
        return m_map.begin();
    }
    Object::iterator Object::begin()
    {
        return m_map.begin();
    }

    Object::const_iterator Object::end() const
    {
        return m_map.end();
    }
    Object::iterator Object::end()
    {
        return m_map.end();
    }

    Object::const_iterator Object::find(const String &key) const
    {
        return m_map.find(key);
    }
    Object::iterator Object::find(const String &key)
    {
        return m_map.find(key);
    }

    void Object::insert(const std::pair<String, TinyJsonValuePtr> &key_value)
    {
        m_map.insert(key_value);
    }

    void Object::insert(const String &key, const TinyJsonValue &value)
    {
        TinyJsonValuePtr pvalue = std::make_shared<TinyJsonValue>(value);
        m_map.insert(std::make_pair(key, pvalue));
    }

    const TinyJsonValuePtr &Object::operator[](const String &key)
    {
        return m_map[key];
    }

    ObjectPtr Object::create_tinyjsonobject()
    {
        ObjectPtr p = std::make_shared<Object>();
        return p;
    }

    std::ostream &operator<<(std::ostream &out, const Object &object)
    {
        out << '{';
        auto it = object.begin();
        while (it != object.end())
        {
            const String &key = it->first;
            const TinyJsonValue &val = *it->second;
            out << key << ":";
            TinyJsonValue::format_value(out, val);
            it++;
            if (it != object.end())
                out << ",";
        }
        out << '}';
        return out;
    }
}